Skip to content

refactor!: compose exact current-format readers - #8024

Merged
Xuanwo merged 22 commits into
mainfrom
xuanwo/exact-version-stack-07-readers
Aug 4, 2026
Merged

refactor!: compose exact current-format readers#8024
Xuanwo merged 22 commits into
mainfrom
xuanwo/exact-version-stack-07-readers

Conversation

@Xuanwo

@Xuanwo Xuanwo commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Part 7/12 of #7877. Depends on #8023.

This is an independently reviewable step toward the final layout demonstrated in #7979.

This PR gives V2.0, V2.1, V2.2, and V2.3 explicit reader composition alongside V1. The root reader keeps shared runtime machinery and type-erased forwarding, but exact version modules own construction, decoder selection, and supported capabilities.

The large shared reader implementation is reduced to mechanisms that are actually common. Version-sensitive choices no longer depend on ordering comparisons or scattered conditions, and the reader still parses persisted identity once at the boundary.

Validation:

  • cargo test -p lance-file
  • cargo clippy --all --tests --benches -- -D warnings
  • uv run make build in python/
  • cargo check --manifest-path java/lance-jni/Cargo.toml

Xuanwo added 20 commits July 21, 2026 16:47
…mat-identity

# Conflicts:
#	rust/lance-file/src/reader.rs
#	rust/lance/src/dataset/transaction.rs
@github-actions github-actions Bot added A-python Python bindings A-index Vector index, linalg, tokenizer A-java Java bindings + JNI A-encoding Encoding, IO, file reader/writer labels Jul 27, 2026
Base automatically changed from xuanwo/exact-version-stack-06-writers to main July 31, 2026 18:16
@Xuanwo
Xuanwo marked this pull request as ready for review July 31, 2026 18:22
…stack-07-readers

# Conflicts:
#	rust/lance-encoding/benches/common/mod.rs
#	rust/lance-encoding/src/array_encoding/physical/bitpack.rs
#	rust/lance-encoding/src/array_encoding/physical/fixed_size_binary.rs
#	rust/lance-encoding/src/array_encoding/strategy.rs
#	rust/lance-encoding/src/compression.rs
#	rust/lance-encoding/src/encoder.rs
#	rust/lance-encoding/src/encodings/logical/primitive/sparse/writer.rs
#	rust/lance-encoding/src/lib.rs
#	rust/lance-encoding/src/testing.rs
#	rust/lance-file/src/lib.rs
#	rust/lance-file/src/reader.rs
#	rust/lance-file/src/version.rs
#	rust/lance-file/src/versions/mod.rs
#	rust/lance-file/src/versions/v1/encoding/plain.rs
#	rust/lance-file/src/versions/v1/mod.rs
#	rust/lance-file/src/versions/v2_0/mod.rs
#	rust/lance-file/src/versions/v2_0/writer.rs
#	rust/lance-file/src/versions/v2_1/compression.rs
#	rust/lance-file/src/versions/v2_1/mod.rs
#	rust/lance-file/src/versions/v2_2/compression.rs
#	rust/lance-file/src/versions/v2_2/mod.rs
#	rust/lance-file/src/versions/v2_3/compression.rs
#	rust/lance-file/src/versions/v2_3/mod.rs
#	rust/lance-file/src/writer.rs
#	rust/lance-file/src/writer/structural.rs
#	rust/lance-file/src/writer_tests.rs
#	rust/lance-file/test_data/exact_versions/README.md
#	rust/lance-index/src/scalar/lance_format.rs
#	rust/lance-index/src/vector/utils.rs
#	rust/lance-table/src/format.rs
#	rust/lance-table/src/format/manifest.rs
#	rust/lance/src/dataset.rs
#	rust/lance/src/dataset/builder.rs
#	rust/lance/src/dataset/fragment.rs
#	rust/lance/src/index/vector/ivf.rs
#	rust/lance/src/index/vector/ivf/io.rs
#	rust/lance/src/index/vector/pq.rs

@lance-gatekeeper lance-gatekeeper Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The exact-version reader roots address a real file-format boundary: V2.0–V2.3 now validate their own footer identity, encoding grammar, alignment, projection shape, and metadata capabilities while shared I/O and decode machinery stays centralized. The stable wire contracts remain covered through exact-version fixtures, and I found no durable-format or correctness blocker.

Comment thread rust/lance-file/src/lib.rs
@Xuanwo Xuanwo changed the title refactor: compose exact current-format readers refactor!: compose exact current-format readers Jul 31, 2026
if gbo_table.is_empty() {
return Err(Error::internal(
"File did not contain any global buffers, schema expected".to_string(),
));
}
let schema_start = gbo_table[0].position;
let schema_size = gbo_table[0].size;

let num_footer_bytes = file_len - schema_start;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we validate the GBO descriptors before using them to build ranges? Here schema_start comes from the file and is used in file_len - schema_start before finish_metadata applies the V2.1+ alignment check. A malformed file can therefore underflow here (or wrap in release) and turn into an oversized read/allocation instead of InvalidInputSource. The indexed-metadata path has the same issue with position + size. Please validate alignment and file bounds with checked arithmetic immediately after decoding the GBO table, before either path performs I/O.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be a follow-up issue? This series is a one-to-one mapping of the old logic and was not intended to change anything else except the code layout.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Xuanwo
Xuanwo merged commit 018386c into main Aug 4, 2026
46 of 47 checks passed
@Xuanwo
Xuanwo deleted the xuanwo/exact-version-stack-07-readers branch August 4, 2026 11:12
Xuanwo added a commit that referenced this pull request Aug 4, 2026
## Why

Main CI broke after #8024 landed: `ReaderProjection::from_column_names`
/ `from_whole_schema` were removed, but IVF index call sites still used
them, so Rust, Java JNI, and Python builds failed to compile.

Separately, newly published RUSTSEC advisories caused `cargo-deny` to
fail on unpinned transitive crates.

## What

- Switch remaining IVF readers/tests to
`lance_file::versions::reader_projection_from_*`
- Bump fixable transitive deps (`anyhow`, `event-listener`, `memmap2`,
`rkyv`, `spin`) in all three lockfiles
- Ignore `RUSTSEC-2026-0002` for `lru` 0.12.x until `goosefs-sdk`
upgrades
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-encoding Encoding, IO, file reader/writer A-index Vector index, linalg, tokenizer A-java Java bindings + JNI A-python Python bindings breaking-change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants